#include <stdio.h>
//typedef //用于重命名复杂类型
//typedef unsigned int unit;
//int main(void) {
//    unsigned int num = 0;//无符号整型
//    unit num2 = 2;
//    return 0;
//}
//static
//1修饰局部变量//出了局部变量不销毁，改变局部变量存储位置，储存在静态区，存在栈区会被使用后销毁
//2修饰全局变量//会使外部链接属性变为内部链接属性其他外部.c源文件无法使用
//3修饰函数// 函数也具有外部链接属性
//void test(){//不需要返回
//    static int a = 1;
//    a++;
//    printf("%d",a);
//}
//int main(){
//    int i = 0;
//    while(i < 10){
//        test();
//        i++;
//    }
//    return 0;
//}
//extern 用于声明外部符号，比如具有外部链接属性的全局变量

//define定义常量/标识符和宏
//#define NUM 100
////宏是有参数的
//#define ADD(x,y) ((x)+(y))//ADD是宏名，x和y是宏参数，x+y是宏体
//int main(){
//    printf("%d\n",NUM);
//    int n = NUM;
//    printf("%d\n",n);
//    return 0;
//}


//指针
//int main(){
//    int a = 10;//申请4个byte的空间,储存10
//    &a;//取地址
//    printf("%p\n",&a);
//    int* p = &a;//取地址并储存这个p就是指针变量，指针就是地址，这个int表示是指向整型，*表示是指针变量
//    char ab = 'w';
//    char * c = &ab;
//    return 0;
//}
//*p 解引用操作符，就是充当找到对象，和a等价
//不管是什么指针类型都是在创建指针变量，故指针变量的大小取决于地址存放所需空间
//32位机器地址是32bit 4byte，64位机器是64bit 8byte
//int main(){
//    printf("%d\n",sizeof(int*));
//    printf("%zu\n",sizeof(char*));
//    printf("%zu\n",sizeof(float*));
//    printf("%zu\n",sizeof(double*));
//    printf("%zu\n",sizeof(short*));
//    printf("%zu\n",sizeof(long*));//x64平台是8个字节x86就是32位
//
//    return 0;
//}
//结构体属于自定义类型，原因是因为c语言中表示某些物质和对象，其性质不单一，而int char float...单一类型不足以描述状态和性质
//struct
struct stu{
    char name[20];
    char gender[10];
    int age;
    char tele[11];
};
void print(struct stu* ps){
    printf("%s %s %d %s\n",(*ps).name,(*ps).gender,(*ps).age,(*ps).tele);
    printf("%s %s %d %s\n",ps->name,ps->gender,ps->age,ps->tele);//结构体指针变量->成员名
}
int main(){
    struct stu s ={"Xiaomin","male",19,"12345678910"};
    printf("%s %s %d %s\n",s.name,s.gender,s.age,s.tele);//结构对象.成员名
    printf(&s);
    return 0;
}
